<?php

namespace App\Http\Controllers\Resource;

use Illuminate\Support\Facades\Log;

/**
 * 中文在线 数字资源 (渝中区未对接)
 *
 *  提供目录接口
 */
class ZwzxController extends CommonController
{
    public $_atiak = '30.osCOd.8779';
    public $appid = '00001';
    public $secure_key = 'F0B0B1A3B840B3EC32F56575C3C8693C';
    public $custumer_type = 'COMMON';
    public $common_type = 'CQST';
    public $single_sign_type = 'WEIXIN_YUN';
    public $single_sign_shid = 'osCOd';

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 图书检索接口
     *          基础参数
     * @param  _apiName String 是 search.book 接口名称
     * @param  _timestamp long 是 1503043834807 时间戳
     * @param  _atiak String 是 唯一标识，单独提供
     * @param  _signature String 是 参数 MD5 签名 md5(“a=1&b=2”+secureKey) secureKey 单独提供
     * @param  _version String 是 1.0 接口版本
     * @param  _type String 是 PC/CLIENT/H5/SERVER 接口调用来源
     *         业务参数
     * @param  keyword String 否 登高望远 检索关键词     不参与签名
     * @param  modify String 否 946656000000 资源更新开始时间，时间戳 （毫秒），不传查全部
     * @param  status int 否 1 1.正常状态值为 1   2.不传查所有状态
     * @param  page int 是 1 1 当前页
     * @param  pageSize int 是 上限 200 20 每页显示记录数
     *
     * 接口说明:
        1. 元数据关键词检索：
        a) 所需参数 keyword, page, pageSize。只返回正常状态的图书。
        2. 元数据更新同步：
        a) 第一次全量同步，所需参数 status=1、page、pageSize。
        b) 每天定时同步，所需参数 modify、page、pageSize，modify=前一天(如：
        946656000000)。返回数据包含前一天新增以及有修改的元数据。
        C) 返回结果中 status=1 为正常状态，其它为非正常状态(不显示)。
     */
    public function bookSearch($modify, $status = 1, $keywords = null, $page = 1, $limit = 10)
    {
        $url = 'https://caos.chineseall.cn/api/gateway';
        $param = [
            '_apiName' => 'search.book',
            '_atiak' => $this->_atiak,
            '_timestamp' => time() . '000',
            '_version' => '1.0',
            '_type' => 'H5', //PC/CLIENT/H5/SERVER 中选一个
            'status' => $status,
            'page' => $page,
            'pageSize' => $limit
        ];

        //不要的值，不传
        if ($modify) {
            $param['modify'] = $modify;
        }
        if ($keywords) {
            $param['keyword'] = $keywords;
        }

        $param = $this->arraySort($param);
        $params = http_build_query($param);

        $_signature = strtoupper(md5(urldecode($params) . $this->secure_key)); //签名中文不转码，传输中文需要转码  urldecode 中文按正常输出
        $url .= "?" . $params . '&_signature=' . $_signature;
        $result = request_url($url);
        $result = json_decode($result, true);
        dump($result);
        die;
        if (empty($result['success']) || $result['success'] !== true) {
            Log::channel('zwzxlog')->debug('资源获取失败');
            Log::channel('zwzxlog')->debug($param);
            Log::channel('zwzxlog')->debug($result);
            Log::channel('zwzxlog')->debug('--------------------------------------------------------');
            return []; //没数据时，返回的false
        }
        return  $result;
    }


    /**
     *获取图书目录
     *          基础参数
     * @param  _apiName String 是 search.book 接口名称
     * @param  _timestamp long 是 1503043834807 时间戳
     * @param  _atiak String 是 唯一标识，单独提供
     * @param  _signature String 是 参数 MD5 签名 md5(“a=1&b=2”+secureKey) secureKey 单独提供
     * @param  _version String 是 1.0 接口版本
     * @param  _type String 是 PC/CLIENT/H5/SERVER 接口调用来源
     *         业务参数
     * @param  bookShId String 是 图书 ShId
     * @param  bookType String 是 图书的 defaultType，PDF 或者 EPUB
     */
    public function getBookCatalogue($book_sh_id, $book_type)
    {
        $url = 'https://caos.chineseall.cn/api/gateway';
        $param = [
            '_apiName' => 'book.contents.list',
            '_timestamp' => time() . '000',
            '_atiak' => $this->_atiak,
            '_version' => '1.0',
            '_type' => 'H5', //PC/CLIENT/H5/SERVER 中选一个
            'bookShId' => $book_sh_id,
            'bookType' => $book_type
        ];

        $param = $this->arraySort($param);
        $params = http_build_query($param);

        $_signature = strtoupper(md5(urldecode($params) . $this->secure_key)); //签名中文不转码，传输中文需要转码  urldecode 中文按正常输出
        $url .= "?" . $params . '&_signature=' . $_signature;
        $result = request_url($url);
        $result = json_decode($result, true);
        if (empty($result['success']) || $result['success'] !== true) {
            Log::channel('zwzxlog')->debug('资源获取失败');
            Log::channel('zwzxlog')->debug($param);
            Log::channel('zwzxlog')->debug($result);
            Log::channel('zwzxlog')->debug('--------------------------------------------------------');
            return false;
        }
        return  $result;
    }

    /**
     * 单点登录接口
     * @param  appid 固定值：00001 必传
     * @param  custumerType 固定值：COMMON 必传：应用类型
     * @param  shid 机构唯一标识 必传，不同机构使用不同 shid，参数单独提供
     * @param  uid 用户唯一标识 必传，不同用户使用不同 uid
     * @param  type 请求登录类型 必传，参数单独提供
     * @param  redirectUrl 登录后跳转地址 地址单独提供
     * @param  code 认证码
                    生成规则：md5(uid+commonType+date+key)；
                    其中：
                    commonType 为机构域名大写，参数单独提供；  commonType=CQST
                    date 为系统时间，短日期格式，格式规定为：yyyyMMdd；
                    key 为密钥，参数单独提供；   key=F0B0B1A3B840B3EC32F56575C3C8693C
                    注意：变量间没有连接符，直接拼合字符串，MD5 编码为 32 位大写.
                    例如：
                    md5("0440062149488*****20230907 ********** ", 32) =
                    BC57535B5D20FA8C2A84A33DF875F395
     * @param backurl 错误跳转地址 非必传：未登录或登录失败状态后跳转的页面,如：推荐地址单独提供
     *        //在线阅读页：https://cqst.w.chineseall.cn/book/read/{shId}/{defaultType}
     */
    public function singleSign($user_id, $book_sh_id, $book_type)
    {
        $url = 'https://passport-open.chineseall.cn/account/custumer/thirdparty/web/login';

        $code = md5($user_id . $this->common_type . date('Ymd') . $this->secure_key);
        $data = [
            'url' => $url,
            'appid' => $this->appid,
            'custumerType' => $this->custumer_type,
            'shid' => $this->single_sign_shid, //此shid为机构shid，用于单点登录接口
            'uid' => $user_id,
            'type' => $this->single_sign_type,
            'code' => $code,
            'redirectUrl' => 'https://cqst.w.chineseall.cn/book/read/' . $book_sh_id . '/' . $book_type,
        ];

        return  $data;
    }


    /**
     * 字典序排序
     */
    public function arraySort(array $param)
    {
        ksort($param);
        reset($param);

        return $param;
    }
}
